#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      Administrador
#
# Created:     14/09/2011
# Copyright:   (c) Administrador 2011
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import ply.lex as lexer

palabras_reservadas =  ['CONTEXT', 'PRE', 'POST','INV','IMPLIES','NOT','OR','XOR','AND','IF','THEN','ELSE','ENDIF', 'CONCAT', 'SIZE', 'TOLOWER',
                        'TOUPPER', 'COUNT', 'EXCLUDES', 'EXCLUDESALL', 'INCLUDES', 'INCLUDESALL', 'ISEMPTY', 'NOTEMPTY', 'SIZE', 'SUM', 'EXISTS', 'SELECT']

palabras_reservadas_dict = dict([(x.lower(),x)for x in palabras_reservadas])

operadores_puntuacion = ["DOBLE_DOS_PUNTOS","DOS_PUNTOS","ABRE_PARENTESIS","CIERRA_PARENTESIS","IGUAL","SUMA","RESTA","MENOR","MENOR_IGUAL",
                        "MAYOR_IGUAL","MAYOR","DIVISION","MULTIPLICACION","DISTINTO","COMA","PUNTO","FLECHA", "ARROBA_PRE", "BARRA", "NUMERAL"]

operadores_puntuacion_dict = dict([(x,x)for x in operadores_puntuacion])

tokens = ("NAME","NUMBER") + tuple(palabras_reservadas_dict.values()) + tuple(operadores_puntuacion_dict.values())


'----------------------FUNCIONES_VARIAS-------------------------------------'

def t_NAME(t):
    r'[a-zA-Z_]\w*'
    t.type=palabras_reservadas_dict.get(t.value,'NAME')
    return t

def t_NUMBER(t):
    r'[0-9][0-9]*(\.[0-9][0-9]*)?((e|E)(\+|-)?[0-9][0-9]*)?'
    string = str(t).split("'")
    if (('.' in string[1]) or ('e' in string[1]) or ('E' in string[2])):
        t.value=float(t.value)
    else:
        t.value=int(t.value)

    t.type=palabras_reservadas_dict.get(t.value,'NUMBER')
    return t

#Ignorar espacios en blanco
t_ignore=' \t'

'----------------------OPERADORES_PUNTUACION-------------------------------------'

t_ARROBA_PRE=r'\@\pre'
t_DOBLE_DOS_PUNTOS=r'\:\:'
t_MAYOR_IGUAL=r'\>\='
t_MENOR_IGUAL=r'\<\='
t_ABRE_PARENTESIS=r'\('
t_CIERRA_PARENTESIS=r'\)'
t_PUNTO=r'\.'
t_COMA=r'\,'
t_DOS_PUNTOS=r'\:'
t_SUMA=r'\+'
t_RESTA=r'\-'
t_MULTIPLICACION=r'\*'
t_DIVISION=r'\/'
t_IGUAL=r'\='
t_MENOR=r'\<'
t_MAYOR=r'\>'
t_FLECHA=r'\-\>'
t_DISTINTO=r'\<\>'
t_BARRA=r'\|'
t_NUMERAL=r'\#'

#Contar nuevas lineas
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

#Control de Errores
def t_error(t):
    print "\nlex: Error lexico en linea %d, token='%s'\n" % (t.lineno, t.value[0])
    t.lexer.skip(1)

lexer=lexer.lex()

##if __name__=='__main__':
##    entrada='''2000'''
##    lexer.input(entrada)
##    while True:
##        tok=lexer.token()
##        if not tok:break
##        print tok
